package mysql

import (
	"testrpc/biz/context"
	"testrpc/conf"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

var (
	DB  *gorm.DB
	err error
)

func Init() {
	DB, err = gorm.Open(mysql.Open(conf.GetConf().MySQL.DSN), &gorm.Config{
		PrepareStmt:            true,
		SkipDefaultTransaction: true,
	})
	if err != nil {
		panic(err)
	}

	// 注册创建回调
	_ = DB.Callback().Create().Before("gorm:create").Register("set_tenant_id", func(db *gorm.DB) {
		// 检查记录中的TenantID字段是否已经设置了值
		if field, ok := db.Statement.Schema.FieldsByName["TenantID"]; ok {
			// 获取当前字段的值
			if _, isZero := field.ValueOf(db.Statement.Context, db.Statement.ReflectValue); isZero {
				// 如果当前字段是零值，则根据上下文设置tenant_id
				tenantID := context.GetTenantFromContext(db.Statement.Context)
				if tenantID != "" {
					db.Statement.SetColumn(field.DBName, tenantID)
				} else {
					db.Statement.AddClause(clause.Where{
						Exprs: []clause.Expression{
							clause.Eq{Column: "tenant_id", Value: "0"},
						},
					})
				}
			}
			// 如果字段已经有值，则不做任何操作
		}
	})
	// 注册查询回调
	_ = DB.Callback().Query().Before("gorm:query").Register("add_tenant_condition", func(db *gorm.DB) {
		tenantID := context.GetTenantFromContext(db.Statement.Context)
		isEnabled := context.IsTenantIsolationEnabled(db.Statement.Context)
		if tenantID != "" && isEnabled {
			if _, ok := db.Statement.Schema.FieldsByName["TenantID"]; ok {
				db.Statement.AddClause(clause.Where{
					Exprs: []clause.Expression{
						clause.Eq{Column: "tenant_id", Value: tenantID},
					},
				})
			}
		}
	})

	// 注册创建回调 - 设置商户ID
	_ = DB.Callback().Create().Before("gorm:create").Register("set_merchant_id", func(db *gorm.DB) {
		// 检查记录中的MerchantID字段是否已经设置了值
		if field, ok := db.Statement.Schema.FieldsByName["MerchantID"]; ok {
			// 获取当前字段的值
			if _, isZero := field.ValueOf(db.Statement.Context, db.Statement.ReflectValue); isZero {
				// 如果当前字段是零值，则根据上下文设置merchant_id
				merchantID := context.GetMerchantIDFromContext(db.Statement.Context)
				enabled := context.IsTenantIsolationEnabled(db.Statement.Context)
				if merchantID != "" && enabled {
					db.Statement.SetColumn(field.DBName, merchantID)
				} else {
					db.Statement.AddClause(clause.Where{
						Exprs: []clause.Expression{
							clause.Eq{Column: "merchant_id", Value: "0"},
						},
					})
				}
			}
			// 如果字段已经有值，则不做任何操作
		}
	})

	// 注册查询回调 - 添加商户过滤条件
	_ = DB.Callback().Query().Before("gorm:query").Register("add_merchant_condition", func(db *gorm.DB) {
		merchantID := context.GetMerchantIDFromContext(db.Statement.Context)
		isEnabled := context.IsMerchantIsolationEnabled(db.Statement.Context)
		if merchantID != "" && isEnabled {
			if _, ok := db.Statement.Schema.FieldsByName["MerchantID"]; ok {
				db.Statement.AddClause(clause.Where{
					Exprs: []clause.Expression{
						clause.Eq{Column: "merchant_id", Value: merchantID},
					},
				})
			}
		}
	})
}
